/*
 * 描          述:  <描述>
 * 修  改   人:  PengQingyang
 * 修改时间:  2022年6月22日
 * <修改描述:>
 */
package com.tx.component.file.configurator;

import com.tx.component.file.resource.FCResourceLoader;
import com.tx.component.file.resource.impl.LocalAwareFCResourceLoader;
import com.tx.component.file.resource.impl.MinIOFCResourceLoader;
import com.tx.core.exceptions.util.AssertUtils;

import io.minio.MinioClient;

/**
 * 本地文件目录工厂
 * 存储桶名称必须介于 3（最少）到 63（最多）个字符之间。
 * 存储桶名称只能由小写字母、数字、句点 (.) 和连字符 (-) 组成。
 * 存储桶名称必须以字母或数字开头和结尾。
 * 存储桶名称不得包含两个相邻的句点。
 * 存储桶名称不得采用 IP 地址格式（例如，192.168.5.4）。
 * 存储桶名称不得以前缀 xn-- 开头。
 * 存储桶名称不得以后缀 -s3alias 结尾。此后缀是为接入点别名预留的。有关更多信息，请参阅为您的 S3 桶访问点使用桶式别名。
 * 存储桶名称在分区内所有 AWS 区域中的所有 AWS 账户间必须是唯一的。分区是一组区域。AWS 目前有三个分区：aws（标准区域）、aws-cn（中国区域）和 aws-us-gov（AWS GovCloud (US) 区域）。
 * 存储桶名称不能被同一分区中的另一个 AWS 账户使用，直到存储桶被删除。
 * 与 Amazon S3 Transfer Acceleration 一起使用的存储桶名称中不能有句点 (.)。有关 Transfer Acceleration 的更多信息，请参阅使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输。
 * 
 * @author  PengQingyang
 * @version  [版本号, 2022年6月22日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class MinIOFCResourceLoaderBuilder extends FCResourceLoaderBuilder {
    
    /**
     * 创建VFSFCResource的工厂类<br/>
     * <功能详细描述>
     * @return [参数说明]
     * 
     * @return VFSFCResourceFactory [返回类型说明]
     * @exception throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     */
    public static MinIOFCResourceLoaderBuilder newInstance() {
        MinIOFCResourceLoaderBuilder factory = new MinIOFCResourceLoaderBuilder();
        return factory;
    }
    
    /** 路径 */
    private String localPath = null;
    
    /** 是否本地注入 */
    private boolean localAware = false;
    
    /** 路径 */
    private MinioClient minioClient = null;
    
    /** 路径 */
    private String bucketName = null;
    
    /** <默认构造函数> */
    MinIOFCResourceLoaderBuilder() {
        super();
    }
    
    /**
     * @return
     */
    @Override
    public FCResourceLoader build() {
        AssertUtils.notEmpty(this.catalog, "catalog is empty.");
        AssertUtils.notEmpty(this.bucketName, "bucketName is empty.");
        AssertUtils.notNull(this.minioClient, "minioClient is null.");
        
        if (this.localAware) {
            AssertUtils.notEmpty(this.localPath, "localPath is empty.");
            
            MinIOFCResourceLoader ossResourceLoader = new MinIOFCResourceLoader(
                    this.minioClient, bucketName);
            ossResourceLoader.afterPropertiesSet();
            
            LocalAwareFCResourceLoader loader = new LocalAwareFCResourceLoader(
                    catalog, this.localPath, ossResourceLoader);
            return loader;
        } else {
            MinIOFCResourceLoader loader = new MinIOFCResourceLoader(
                    this.minioClient, bucketName);
            return loader;
        }
    }
    
    /**
     * @param 对localPath进行赋值
     */
    public MinIOFCResourceLoaderBuilder localPath(String localPath) {
        this.localPath = localPath;
        return this;
    }
    
    /**
     * @param 对localAware进行赋值
     */
    public MinIOFCResourceLoaderBuilder localAware(boolean localAware) {
        this.localAware = localAware;
        return this;
    }
    
    /**
     * @param 对ossClient进行赋值
     */
    public MinIOFCResourceLoaderBuilder minIoClient(MinioClient minioClient) {
        this.minioClient = minioClient;
        return this;
    }
    
    /**
     * @param 对bucketName进行赋值
     */
    public MinIOFCResourceLoaderBuilder bucketName(String bucketName) {
        this.bucketName = bucketName;
        return this;
    }
}
